// 输出是什么?
(() => {

let x = (y = 10);

})();

console.log(typeof x);

console.log(typeof y);

// A.
// "undefined", "number"

// B.
// "number", "number"

// C.
// "object", "number"

// D.
// "number", "undefined"

// 正确答案：
// A
// 解析：
// let x = y = 10; 是下面这个表达式的缩写:
// y = 10;

// let x = y;

// 我们设定y等于10时,我们实际上增加了一个属性y给全局对象(浏览器里的window, Nodejs里的global)。在浏览器中， window.y等于10.
// 然后我们声明了变量x等于y,也是10.但变量是使用 let声明的，它只作用于 块级作用域, 仅在声明它的块中有效；就是案例中的立即调用表达式(IIFE)。使用typeof操作符时, 操作值 x没有被定义：因为我们在x声明块的外部，无法调用它。这就意味着x未定义。未分配或是未声明的变量类型为"undefined". console.log(typeof x)返回"undefined".
// 而我们创建了全局变量y，并且设定y等于10.这个值在我们的代码各处都访问的到。 y已经被定义了，而且有一个"number"类型的值。 console.log(typeof y)返回"number".




// 输出的是什么?
function getInfo(member, year) {

member.name = "Lydia";

year = "1998";

}

const person = { name: "Sarah" };

const birthYear = "1997";

getInfo(person, birthYear);

console.log(person, birthYear);

// A.
// { name: "Lydia" }, "1997"

// B.
// { name: "Sarah" }, "1998"

// C.
// { name: "Lydia" }, "1998"

// D.
// { name: "Sarah" }, "1997"

// 正确答案：
// A
// 解析：
// 普通参数都是 值 传递的，而对象则不同，是 引用 传递。所以说，birthYear是值传递，因为他是个字符串而不是对象。当我们对参数进行值传递时，会创建一份该值的 复制 。（可以参考问题46）
// 变量birthYear有一个对"1997"的引用，而传入的参数也有一个对"1997"的引用，但二者的引用并不相同。当我们通过给 year赋值"1998"来更新year的值的时候我们只是更新了year（的引用）。此时birthYear仍然是"1997".

// 而person是个对象。参数member引用与之 相同的 对象。当我们修改member所引用对象的属性时,person的相应属性也被修改了,因为他们引用了相同的对象. person的 name属性也变成了 "Lydia".





// 输出是什么?
function greeting() {

throw "Hello world!";

}

function sayHi() {

try {

const data = greeting();

console.log("It worked!", data);

} catch (e) {

console.log("Oh no an error!", e);

}

}

sayHi();

// A.
// "It worked! Hello world!"

// B.
// "Oh no an error: undefined

// C.
// SyntaxError: can only throw Error objects

// D.
// "Oh no an error: Hello world!

// 正确答案：
// D
// 解析：
// 通过throw语句，我么可以创建自定义错误。 而通过它，我们可以抛出异常。异常可以是一个字符串, 一个 数字, 一个 布尔类型 或者是一个 对象。在本例中，我们的异常是字符串'Hello world'.
// 通过 catch语句，我们可以设定当try语句块中抛出异常后应该做什么处理。在本例中抛出的异常是字符串'Hello world'. e就是这个字符串，因此被输出。最终结果就是'Oh an error: Hello world'.




// 输出是什么?
function Car() {

this.make = "Lamborghini";

return { make: "Maserati" };

}

const myCar = new Car();

console.log(myCar.make);

// A.
// Lamborghini

// B.
// Maserati

// C.
// ReferenceError

// D.
// TypeError

// 正确答案：
// B
// 解析：
// 返回属性的时候，属性的值等于 返回的 值，而不是构造函数中设定的值。我们返回了字符串 "Maserati"，所以 myCar.make等于"Maserati".





// 输出是什么?
const numbers = [1, 2, 3, 4, 5];

const [y] = numbers;

console.log(y);

// A.
// [[1, 2, 3, 4, 5]]

// B.
// [1, 2, 3, 4, 5]

// C.
// 1

// D.
// [1]

// 正确答案：
// C
// 解析：
// 我们可以通过解构赋值来解析来自对象的数组或属性的值，比如说
// [a, b] = [1, 2];

// a的值现在是1，b的值现在是2